#include "lyricswindow.h"
#include "ui_lyricswindow.h"

LyricsWindow::LyricsWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LyricsWindow)
{
    ui->setupUi(this);
    lyric_manager = new QNetworkAccessManager;//歌词信息
    //绑定歌词信息请求信号
    connect(lyric_manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
}

LyricsWindow::~LyricsWindow()
{
    delete ui;
    delete lyric_manager;
}


//歌词信息应答槽
void LyricsWindow::replyFinished(QNetworkReply*reply)
{
    //判断网页是否响应成功
    //    QNetworkRequest::HttpStatusCodeAttribute网址返回的状态码
    if(200==reply->attribute(QNetworkRequest::HttpStatusCodeAttribute))
    {
        parseJson_lyrics(reply->readAll());//解析json数据
//        qDebug()<<QString(reply->readAll())<<endl;//将字节数组转换成字符串
    }
    else
    {
        QMessageBox::warning(this,"网页访问失败","请求超时!");
    }

}

//歌词JSON数据解析
void LyricsWindow::parseJson_lyrics(QByteArray byteArray)
{
    lrcMap.clear();//每次保存前清空上一次歌词内容
    QJsonDocument doc = QJsonDocument::fromJson(byteArray);//直接从字节数组中获得一个JSON文档
    if(doc.isObject())//问文档内部是否是一个对象？
    {
        QJsonObject obj = doc.object();//返回文档内的对象
        if(obj.contains("lrc") == false)//问文档对象是否包含lrc关键字
        {
            qDebug()<<"错误的JSON对象"<<endl;
            return;
        }
        QJsonValue var = obj.value("lrc");//获得关键字lrc对应的结果
        if(var.isObject() == false)
        {
            qDebug()<<"lrc的值不是一个对象"<<endl;
            return;
        }
        QJsonObject lrcObj = var.toObject();//把lrc的值转为一个对象
        if(lrcObj.contains("lyric"))
        {
            var=lrcObj.value("lyric");
            lyric=var.toString();//获取当前歌曲歌词
            qDebug()<<"歌词:"<<lyric;
            // 分行处理歌词
            QStringList lines = lyric.split("\n");
            QRegExp timeRegex(R"(\[(\d{2}):(\d{2}).(\d{3})\])"); // 时间戳的正则表达式

            for (const QString &line : lines)
            {
                if (timeRegex.indexIn(line) != -1) // 找到时间戳
                {
                    int minutes = timeRegex.cap(1).toInt(); // 分
                    int seconds = timeRegex.cap(2).toInt(); // 秒
                    int milliseconds = timeRegex.cap(3).toInt(); // 毫秒

                    int totalMilliseconds = (minutes * 60 + seconds) * 100 + milliseconds; // 转换为总毫秒
                    QString lyricText = line.mid(timeRegex.matchedLength()).trimmed(); // 获取歌词文本

                    lrcMap.insert(totalMilliseconds, lyricText); // 保存到 QMap
                }
            }
        }
    }
}



//设置当前歌曲ID
void LyricsWindow::set_songId(unsigned int songId)
{
    this->songId=songId;
    //歌词信息请求
    lyric_manager->get(QNetworkRequest(QUrl(QString("https://music.163.com/api/song/lyric?id=%1&lv=1&kv=1&tv=-1").arg(songId))));
//    qDebug()<<"LyricsWindow::"<<songId;
}

//关闭歌词窗体
void LyricsWindow::closed()
{
    this->close();
}

// 歌词滚动
void LyricsWindow::positionChanged(qint64 position)
{
    // 将播放位置转换为毫秒
    int pos = position / 10;
    // 清空标签内容
    ui->label_1->clear();
    ui->label_2->clear();
    ui->label_3->clear();
    ui->label_4->clear();
    ui->label_5->clear();
    ui->label_6->clear();
    ui->label_7->clear();
    ui->label_8->clear();

    // 使用 lowerBound 找到当前时间对应的歌词
    QMap<int, QString>::iterator iter = lrcMap.lowerBound(pos);

    // 设置前两句歌词
    for (int i = 2; i >= 1; --i) {
        if (iter != lrcMap.begin()) {
            --iter;
            if (i == 1) ui->label_2->setText(iter.value());  // 上一行
            else if (i == 2) ui->label_1->setText(iter.value());  // 再上一行
        } else {
            if (i == 1) ui->label_2->clear();  // 如果没有上一行，清空
            else if (i == 2) ui->label_1->clear();  // 如果没有再上一行，清空
        }
    }

    // 中间的歌词
    if (iter != lrcMap.end()) {
        ui->label_3->setStyleSheet("QLabel { color : red; }"); // 当前歌词显示为红色
        ui->label_3->setText(iter.value());
    } else {
        ui->label_3->clear();  // 清空如果迭代器已到达结束
    }

    qDebug() << "当前播放位置:" << pos;
    qDebug() << "当前歌词:" << ui->label_3->text();
    // 设置下一句歌词
    ++iter;
    if (iter != lrcMap.end()) {
        ui->label_4->setText(iter.value());
    } else {
        ui->label_4->clear();
    }

    // 继续设置后面的歌词
    for (int i = 5; i <= 8; ++i) {
        ++iter;
        if (iter != lrcMap.end()) {
            switch (i) {
                case 5: ui->label_5->setText(iter.value()); break;
                case 6: ui->label_6->setText(iter.value()); break;
                case 7: ui->label_7->setText(iter.value()); break;
                case 8: ui->label_8->setText(iter.value()); break;
            }
        } else {
            switch (i) {
                case 5: ui->label_5->clear(); break;
                case 6: ui->label_6->clear(); break;
                case 7: ui->label_7->clear(); break;
                case 8: ui->label_8->clear(); break;
            }
        }
    }
}





